//==========================================================
// Exception.h
//
// Exceptions définies par le moteur
//
//==========================================================

#ifndef EXCEPTION_H
#define EXCEPTION_H

//==========================================================
// En-têtes
//==========================================================
#include <exception>
#include <string>

namespace Tools
{
    //==========================================================
    // Classe de base pour les exceptions
    //==========================================================
    class Exception //: public std::exception
    {
    public :

        //----------------------------------------------------------
        // Constructeur
        //----------------------------------------------------------
        Exception(const std::string& Message = "");

        //----------------------------------------------------------
        // Destructeur
        //----------------------------------------------------------
        virtual ~Exception();

        //----------------------------------------------------------
        // Renvoie le message associé à l'exception
        //----------------------------------------------------------
        virtual const char* what() const;

    protected :

        //----------------------------------------------------------
        // Données membres
        //----------------------------------------------------------
        std::string m_Message; // Message associé à l'exception
    };


    //==========================================================
    // Exception lancée si une condition n'est pas vérifiée
    //==========================================================
    struct AssertException : public Exception
    {
        AssertException(const std::string& File, int Line, const std::string& Message);
    };
//    #if (_DEBUG == 1)
//    #   define Assert(condition) if (!(condition)) throw AssertException(__FILE__, __LINE__, "Condition non satisfaite\n\n" #condition)
//    #else
//        inline void DoNothing(bool) {}
//    #   define Assert(condition) DoNothing(!(condition))
//    #endif

    #define Assert(condition) if (!(condition)) throw Tools::AssertException(__FILE__, __LINE__, "Condition non satisfaite : " #condition)

    //==========================================================
    // Exception lancée lors d'erreur de chargement de fichiers
    //==========================================================
    struct LoadingFailed : public Exception
    {
        LoadingFailed(const std::string& File, const std::string& Message);
    };    

	//==========================================================
    // Exception lancée lorsque le device n'est pas valide
    //==========================================================
    struct InvalidDevice : public Exception
    {
        InvalidDevice(const std::string& Message);
    }; 
    
    //==========================================================
    // Exception lancée lorsque le device n'est pas valide
    //==========================================================
    struct InvalidImageSize : public Exception
    {
        InvalidImageSize(int width, int height, const std::string& Message);
    }; 
    
    //==========================================================
    // Exception lancée lorsque le calibrage échoue
    //==========================================================
    struct CalibrationFailed : public Exception
    {
        CalibrationFailed(const std::string& Message);
    }; 
    
    //==========================================================
    // Exception lancée lorsque lorsqu'une opération n'a pu être 
    // effectuée car le système était occupée
    //==========================================================
    struct SystemBusy : public Exception
    {
        SystemBusy();
    };
    
    
} // namespace Tools


#endif // EXCEPTION_H
